;
; Esqueleto para programas em assembly (NASM)
; Plataforma alvo: arquivos objetos (OBJ/EXE) 16-bit (DOS)
;
; montar com a opcao -fobj
;


SEGMENT code                ; segmento de codigo
..start:                    ; ponto de entrada do programa
 
  mov  ax, data             ; inicializa DS
  mov  ds, ax

  mov  ax, stack            ; inicializa pilha (SS:SP)
  mov  ss, ax
  mov  sp, stacktop

;
; SEU CODIGO A PARTIR DAQUI
;
mov ah, 1     ;comando de leitura
int 0x21      ;executa comando em dos

mov ah,2      ;comando de impressao

mov dl,13     ;Fim de linha
int 0x21      ;print
mov dl,10     ;Pula Linha
int 0x21      ;print

cmp al, 0x30  ;compara com o valor ascii do char '0'
jb caracinv   ;se for char invalido

cmp al, 0x39  ;compara com o valor ascii do char '9'
ja caracter   ;se for char de digito numerico

  sub al,0x30 ;subtrai '0' para 0
  mov cx,8    ;determina contador
  
  jmp passabits

caracter:

  cmp al, 0x41  ;compara com o valor ascii do char '0'
  jb caracinv   ;se for char invalido
  
  cmp al, 0x45  ;compara com o valor ascii do char '9'
  ja caracterl   ;se for char de digito Hcase
    
    sub al,0x37 ;subtrai 'A' para 10
    mov cx,8    ;determina contador
    
    jmp passabits

caracterl:

  cmp al, 0x61  ;compara com o valor ascii do char '0'
  jb caracinv   ;se for char invalido
  
  cmp al, 0x65  ;compara com o valor ascii do char '9'
  ja caracinv   ;se for char de digito numerico
    
    sub al,0x57 ;subtrai 'a' para 10
    mov cx,8    ;determina contador

    jmp passabits
  
caracinv:
  mov dl,0x58  ;caracter X
  int 0x21     ;print
  jmp end

passabits:
  mov dl,al
  dec cx
  shr dl,cl
  and dl,1
  add dl,0x30
  int 0x21
  cmp cx,0
  jnz passabits

end:
  mov  ah, 0x4C             ; volta controle ao DOS
  int  0x21


SEGMENT data                ; segmento de dados
; SEUS DADOS A PARTIR DAQUI


SEGMENT stack stack        ; segmento de pilha
  RESB 256
stacktop:
